本來預計要寫view傳值給controller的部分
但是突然想到model傳值的部分還沒有寫到
順便寫一下多model傳遞,使用viewModel以及Tuple的差別!
多Model傳遞
在複雜的應用中,常常會需要同時使用到多個Model資料
其實前面說過的viewBag,viewData也都可以傳遞Model物件
這樣的寫法雖然有時比較方便,但其實並不太好
public ActionResult DemoMModel(){
viewBag.class=db.Class.ElementAt(1);
viewBag.students=db.Student.Where(c=>c.classID==1).ToList();
return View();
}
在View中就可以這樣使用
@{
var class=(DemoApp.Models.Class)ViewBag.class;
}
<h3>@class.name</h3>
<ul>
@foreach(var item in ViewBag.students as List<DemoApp.Models.Student>){
<li>
@item.name
</li>
}
</ul>
大概是這樣的使用方式,傳遞的model少的話可以用這個方式
但是多的話就不建議這樣做,
...這樣還要一個一個對viewBag的命名,很不方便(不好意思鄉民魂發作
ViewModel
多model傳遞時,建議可以建立一個viewModel類別來傳遞
建立方式很簡單
public class ClassStudentViewModel
{
public Class class{get;set;}
public IEnumerable<Student> students{get;set;}
}
建立完後,在action內使用
public ActionResult DemoMModel(){
return View(new ClassStudentViewModel(){
class=db.Class.ElementAt(1),
students=db.Student.Where(c=>c.classID==1).ToList()
});
}
傳遞到view後的使用方式
@model DemoApp.Models.ViewModels.ClassStudentViewModel
<h3>@Model.class.name</h3>
<ul>
@foreach(var item in Model.students){
<li>
@item.name
</li>
}
</ul>
這樣在view中讀取時是不是簡單多了呢~
雖然還要建立一個viewModel很麻煩就是了
小提醒是,一個viewModel最好對應一個view就好~
不然需要改動時,會牽扯到很多個view非常不方便!
Tuple類別
不用建立viewModel也可以傳遞多個Model的方法!
Tuple類別可以傳遞1~7個項目
使用方式如下
public ActionResult DemoTuple()
{
var class=db.Class.ElementAt(1);
var students=db.Student.Where(c=>c.classID==1).ToList();
var tupleModel=new Tuple<Class,List<Studnet>>(class,students);
//var tupleModel=Tuple.Create(class,students);
//兩句相等
return View(tupleModel);
}
View內使用
@using DemoApp.Models;
@model Tuple<Class,List<Studnet>>
@*Item1 is Class*@
<h3>@Model.Item1.name</h3>
<ul>
@*Item1 is List<Studnet>*@
@foreach(var item in Model.Item2){
<li>
@item.name
</li>
}
</ul>
要注意的是讀取的方式是Model.Item1,Model.Item2...這樣讀取
在可讀性上會比較差一些,建議使用時要寫上註解,補強可讀性!
那麼明天再來介紹view傳值給controller的方式吧!~